package com.colin.ui.component;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

public class MyComboBox extends JComboBox<String> {
    private JTextField comboBox_textField = (JTextField) this.getEditor().getEditorComponent();
    private DefaultComboBoxModel<String> init_ComboBoxModel = null;
    private JComboBox<String> this_comboBox = this;
    private Vector<String> content = null;

    //无参构造函数
    MyComboBox() {
        super();
        initMyComboBox();
    }

    //字符串数组参数的构造函数
    MyComboBox(String[] items) {
        super(items);
        List<String> list = new ArrayList<String>(Arrays.asList(items));
        Vector<String> temp_content = new Vector<String>(list);
        initMyComboBox(temp_content);
    }

    //动态字符串数组参数的构造函数
    MyComboBox(Vector<String> items) {
        super(items);
        initMyComboBox(items);
    }

    //初始化NameComboBox，打开可编辑属性，打开下拉框联想功能，content赋初值
    private void initMyComboBox() {
        this.setEditable(true);
        openLenovo();
        brush();
    }

    private void initMyComboBox(Vector<String> temp_content) {
        initMyComboBox();
        updateDefaultModel(temp_content);
    }

    //设置下拉框的联想数组
    private void setLenovo() {
        String target = getText().trim();
        if ((target.trim()).equals("")) {
            recoverModel();
        } else {
            Vector<String> lenovo = getLenovo(target);
            if (lenovo.size() == 0) {
                this_comboBox.setModel((new DefaultComboBoxModel<String>(new String[]{""})));
            } else {
                setItems(lenovo);
            }
        }
        brush(target);
    }

    //打开下拉框联想功能
    private void openLenovo() {
        this.getEditor().getEditorComponent().addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent arg0) {
                // TODO 自动生成的方法存根
            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO 自动生成的方法存根
                setLenovo();
                this_comboBox.showPopup();
            }

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO 自动生成的方法存根
            }
        });
    }

    //获取联想数组
    private Vector<String> getLenovo(String target) {
        Vector<String> lenovo = new Vector<String>();
        for (int i = 0; i < content.size(); i++) {
            if (content.elementAt(i).contains(target)) {
                lenovo.add(content.elementAt(i));
            }
        }
        return lenovo;
    }

    //设置comboBox自身的文本框中的文本
    public void setText(String text) {
        comboBox_textField.setText(text);
    }

    //返回comboBox自身的文本框中的文本
    public String getText() {
        return comboBox_textField.getText();
    }

    //返回comboBox自身的文本框
    public JTextField getTextField() {
        return comboBox_textField;
    }

    //设置下拉框内容
    public void setItems(Vector<String> items) {
        this.setModel(new DefaultComboBoxModel<String>(items));
    }

    //参数为新的Vector<String>元素，更新模组，只能通过构造函数和外部调用来更新
    public void updateDefaultModel(Vector<String> new_content) {
        content = new_content;
        init_ComboBoxModel = new DefaultComboBoxModel<String>(content);
        this.setModel(init_ComboBoxModel);
        brush();
    }

    //恢复原始内容下拉框
    private void recoverModel() {
        this.setModel(init_ComboBoxModel);
    }

    //刷新
    private void brush() {
        this.setSelectedIndex(-1);
        setText("");
    }

    //刷新输入文本，避免自动填充影响使用体验
    private void brush(String text) {
        brush();
        comboBox_textField.setText(text);
    }

}
